iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1
Modern Web

有角拾系列 第 11

# 微實作PostgreSQL INNER Join

  • 分享至 

  • xImage
  •  

故事背景:

假設我們今天要幫一家貓保母公司建立資料庫,並開兩張表分別紀錄客戶與貓咪

參考資料1:[SQL語法查詢入門.Anthony DeBarros著]
參考資料2:PostgreSQL正體中文使用手冊


建立資料庫

環境:Macbook pro, PostgreSQL, TablePlus

  1. 首先確認終端機環境中是否已安裝SQL(若沒有請諮詢一下Google如何安裝囉),PostgreSQL指令是psql,我們可以輸入psql --version 來查詢本機現行版本
  2. 確定有安裝後,就輸入 createdb 資料庫名稱來件建立資料庫,根據今天的故事我們將資料庫命名為:cats,並在終端機輸入createdb cats
  3. 接下來輸入psql 資料庫名稱,也就是上一步的createdb cats來進入這個資料庫,此外當然也可以使用圖形化介面,像我個人就慣用UI相當良好的TablePlus來查看與操作資料庫(ubuntu使用者可以使用可愛DBeaver)

在終端機中輸入psql 資料庫名稱後,就可以進入該資料庫
在終端機中輸入psql 資料庫名稱後,就可以進入該資料庫

TablePlus畫面
TablePlus畫面


建立資料表

  1. 再來就是建立實際紀錄資料的資料表了,第一個我想先建立客戶資料表並命名為:clients、第二個表格為:cats;然而在開表格前得先規劃好表格中有哪些欄位、資料類型與約束條件。
  • 客戶資料表中我會需要:主鍵id、姓名、性別,三個欄位
欄位 資料類型 約束條件
id serial primary key
name text not null
gender gender not null
  • 其中gender需要自定義(男, 女, 非二元性別),所以開資料表前多做一個動作:create type gender as enum('male', 'female', 'non_binary');

  • 建好自定義資料類型後,就可以建立表格拉,輸入: create table clients ( id serial primary key, name text not null, gender gender not null );

  • 透過TablePlus看資料表是否建立成功

  • 也可以在終端機輸入\d+ clients 來檢查

  1. 想好欄位、資料類型與約束條件後,就可以按相同的步驟建立cats資料表了,欄位分別是:主鍵id、貓咪名、品種、外部鍵(貓咪屬於clients資料表中哪位客戶, a cat belongs to a client)
欄位 資料類型 約束條件
id serial primary key
name text not null
species text not null
owner_id int not null
create table cats ( 
id serial primary key, //主鍵
name text not null, //寵物名
species text not null, //品種
owner_id int not null, //主人id
constraint fk_owner //設定clients表中的id為cats表中的外部鍵:owner_id
  foreign key (owner_id)
    references clients (id) );
    
create index pets_owner_id_idx on pets (owner_id);
  1. 分別為兩張表各塞入3筆資料:
insert into clients (name, gender)
values
('John Doe', 'male'),
('Jane Smith', 'female'),
('Marion Green', 'non_binary');
insert into cats (name, species, owner_id)
values
('Rex', 'American Bobtail', 1),
('Caesar', 'Birman', 1),
('Simba', 'British Shorthair', 2);
  1. 檢查是否有成功將資料輸入對應資料表:
select * from clients;
select * from cats;

  1. 要是我們知道John Doe的ID,便很容易查到他的寵物有哪些:

那麼要是我們不知道Jane Smith的ID,只知道她的名字。這時候使用INNER JOIN的時機就來囉。


INNER JOIN

  1. 由於JOIN預設為INNER JOIN,我們可以直接寫join而不用寫inner join
select * from cats
join clients on clients.id = cats.owner_id
where clients.name = 'Jane Smith';

  1. 另外我們可以為資料表取比較簡短的名稱,比如 clients 可以縮寫成 c,cats因為開頭一樣暫時不給縮寫:
select * from cats
join clients as c on c.id = cats.owner_id //AS 可以省略
where c.name = 'Jane Smith';


番外篇

  1. 查資料的時候發現,這邊的貓咪的品種應該用breed 這個單字而不是species QQ,好險可以用ALTER來修改

ALTER TABLE cats RENAME COLUMN species TO breeds;

文過飾非大成功!

ps. 美國鮑伯尾?XD

英短好可愛:3

資料來源:List of cat breeds(wiki)


上一篇
# 基本資料庫SQL語法
下一篇
# REACT 生態圈
系列文
有角拾30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言